/*
 * Copyright (C) 2020 The LINN Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.juqimiao.linn.context;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.lang.Nullable;

import java.util.Map;

/**
 * {@link ApplicationContext} 的代理类。
 *
 * @author  Collin Cai
 */
public interface ApplicationContextWrapperI {
//    /**
//     * 获取 {@link ApplicationContext} 对象。
//     *
//     * @return {@link ApplicationContext}对象。
//     */
//    ApplicationContext getApplicationContext();

    /**
     * 通过类型获取一个Bean对象，通常这里指定一个具体实现类的类型。
     *
     * @param targetClz {@link Class<?>} 类型。
     * @param <T>       目标类型。
     * @return 返回一个Bean对象。
     */
    <T> T getBean(Class<T> targetClz);

    /**
     * 通过类型全名获取一个Bean对象。
     *
     * @param claz 类型全名。
     * @return 返回一个Bean对象。
     */
    Object getBean(String claz);

    /**
     * 通过一个泛化或抽象类型获取所有实现或继承它的所有Bean对象的集合。
     *
     * @param type 表示一个泛化或抽象类型的{@link Class<?>}。
     * @param <T>  模版类型。
     * @return 返回一个Bean的集合。
     * @throws BeansException 异常。
     */
    <T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;
}